package com.example.reactor;

import reactor.core.publisher.Mono;

public class Practice13 {

    public Mono<Integer> buy(Long uid, Long productId) {
        return Mono.zip(
                        // 假设查找卡片配置信息
                        findCardConfig(productId),
                        // 模拟查询用户平台币数量
                        findUserPlatformCoinCount(uid),
                        // 检查用户是否已购买卡片
                        checkCardPurchased(uid, productId)
                )
                .flatMap(tuple -> {
                    // 获取并处理 zip 中的结果
                    String cardConfig = tuple.getT1();       // 假设卡片配置信息
                    Long platformCoinCount = tuple.getT2();  // 用户平台币数量
                    Boolean hasCard = tuple.getT3();         // 是否已购买卡片

                    // 日志调试
                    System.out.println("Card Config: " + cardConfig + ", Platform Coin: " + platformCoinCount + ", Has Card: " + hasCard);

                    if (!hasCard) {
                        return Mono.error(new Exception("Card not purchased"));
                    }
                    return Mono.just(1);  // 假设购买成功返回 1
                })
                // 捕获异常并返回自定义消息
                .onErrorResume(e -> {
                    System.err.println("Error during buy: " + e.getMessage());
                    return Mono.error(e);  // 出现异常时返回 -1 表示失败
                })
                .thenReturn(1);
    }

    // 模拟查询卡片配置信息
    public Mono<String> findCardConfig(Long productId) {
        return Mono.just("CardConfig-" + productId);  // 简单模拟卡片配置信息
    }

    // 模拟查询用户平台币数量
    public Mono<Long> findUserPlatformCoinCount(Long uid) {
        return Mono.just(100L);  // 假设用户有 100 个平台币
    }

    public Mono<Boolean> checkCardPurchased(Long uid, Long productId) {
//        return Mono.defer(() -> {
        if (productId == null) {
            return Mono.error(new Exception("ProductId is invalid"));
        }
        // 模拟卡片是否已购买的情况
        return Mono.just(productId % 2 == 0);  // 偶数表示已购买，奇数未购买
//        });
    }

    // Main 方法触发执行
    public static void main(String[] args) {
        Practice13 service = new Practice13();

//        // 测试不同的 productId
//        System.out.println("Testing with valid productId (even number):");
//        service.buy(1L, 2L).subscribe(result -> System.out.println("Result: " + result));

        System.out.println("\nTesting with invalid productId (odd number):");
        service.buy(1L, 3L).subscribe(result -> System.out.println("Result: " + result));

//        System.out.println("\nTesting with null productId:");
//        service.buy(1L, null).subscribe(result -> System.out.println("Result: " + result));
    }

}
